home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / 福袋 / 例題プログラム / SEFILE.C < prev    next >
Text File  |  1993-12-31  |  6KB  |  196 lines

  1. /******************************************************************************
  2.  *    sefile.c:    ファイルのロード、セーブ処理関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1993 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stat.h>
  9. #include <io.h>
  10. #include <doslib.h>
  11. #include <sxmemory.h>        /* メモリマンを利用するときに必要    */
  12. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  13. #include <control.h>        /* コントロールマンを利用するときに必要    */
  14. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  15. #include <text.h>        /* テキストマンを利用するときに必要    */
  16. #include <task.h>        /* タスクマンを利用するときに必要    */
  17. #include "sedit.h"        /* このプログラム固有のヘッダファイル    */
  18.  
  19. /******************************************************************************
  20.  *    readFile():    ファイルの読み込み
  21.  ******************************************************************************
  22.  *    引数:    ComVal *pcv    共通変数へのポインタ
  23.  *    戻り値:    int        >= 0: 読み込み成功
  24.  *                = -1: 読み込み失敗
  25.  *                = -2: ファイルが見つからない
  26.  */
  27. int readFile(ComVal *pcv, char *pname)
  28. {
  29.     int hdlProp, fileLen, data, errCode, len;
  30.     FILE *fn;
  31.  
  32.     fn = fopen(pname, "rb");
  33.     if (fn == NULL)
  34.         return -2;
  35.  
  36.     pcv->editFlag = FALSE;        /* 編集フラグをクリアする    */
  37.     if ((*pcv->tEditHdl)->length) {
  38.         /* テキストエディットをすべて消去する */
  39.         TMHide(pcv->tEditHdl);    /* 非表示属性にする        */
  40.         /* 全範囲領域選択する(表示の変更はしない) */
  41.         TMCheckSel(pcv->tEditHdl, 0, (*pcv->tEditHdl)->length, (*pcv->tEditHdl)->length);
  42.         TMDelete(pcv->tEditHdl); /* セレクト部分を削除する    */
  43.         TMCacheFlush(pcv->tEditHdl);
  44.         TMShow(pcv->tEditHdl);    /* 表示属性に戻す        */
  45.     }
  46.     fseek(fn, -1, SEEK_END);
  47.     fileLen = ftell(fn);        /* ファイルサイズを求める    */
  48.     fseek(fn, 0, SEEK_SET);
  49.  
  50.     if (fileLen) {
  51.         /* ハンドルの属性を保存 */
  52.         hdlProp = MMHdlPropGet((*pcv->tEditHdl)->text);
  53.         /* ハンドル を <unlocked block> にする */
  54.         MMHdlUnlock((*pcv->tEditHdl)->text);
  55.         /* ハンドルのサイズを変更する */
  56.         errCode = MMHdlSizeSet((*pcv->tEditHdl)->text, fileLen + 8);
  57.         /* ハンドルの属性を元に戻す */
  58.         MMHdlPropSet((*pcv->tEditHdl)->text, hdlProp);
  59.         if (errCode < 0) {
  60.             fclose(fn);
  61.             pcv->errorCode = 8; /* メモリが確保できなかった    */
  62.             return -1;
  63.         }
  64.         len = fread((unsigned char *) *(*pcv->tEditHdl)->text, sizeof(char), (size_t) fileLen, fn);
  65.         /* バイナリモードでファイルをオープンしているので、
  66.            テキストの終了コード EOF('\x1a')を読み込まないようにする */
  67.         fseek(fn, -1, SEEK_END);
  68.         data = fgetc(fn);
  69.         if (data != '\x1a') {
  70.         /* ファイルの最後が EOF で終わってない場合 */
  71.             (*(*pcv->tEditHdl)->text)[len] = data;
  72.             len++;
  73.             fileLen++;
  74.             data = 0;
  75.         }
  76.         if (len < fileLen) {
  77.             fclose(fn);
  78.             pcv->errorCode = 11; /* リードエラー        */
  79.             return -1;
  80.         }
  81.         TMHide(pcv->tEditHdl);
  82.         (*pcv->tEditHdl)->length = fileLen;
  83.         /* テキストエディットの段落情報をを再計算する */
  84.         TMSetSelCal(pcv->tEditHdl, 0, 0, 0);
  85.         /* テキストエディットの先頭行までスクロール */
  86.         TMPinScroll(pcv->tEditHdl);
  87.         TMShow(pcv->tEditHdl);
  88.         /* テキストエディット全体をアップデートする */
  89.         addUpdate(pcv->windowPtr, &pcv->view);
  90.     }
  91.     fclose(fn);
  92.     strcpy(pcv->fileName, pname);    /* ファイル名をワークに登録する    */
  93.     setWinTitle(pcv, pcv->fileName); /* ウィンドウタイトルを設定する */
  94.  
  95.     return 0;
  96. }
  97.  
  98. /******************************************************************************
  99.  *    saveFile():    ファイルのセーブ
  100.  ******************************************************************************
  101.  *    引数:    ComVal *pcv    共通変数へのポインタ
  102.  */
  103. void saveFile(ComVal *pcv)
  104. {
  105.     char fWork[TS_NAMEMAX];
  106.  
  107.     strcpy(fWork, pcv->fileName);
  108.     /* ファイル名とドライブの状態をチェックする */
  109.     if (!checkDrive(pcv, fWork, 0)) {
  110.         showErrDialog(pcv); /* エラーダイアログを表示する */
  111.         pcv->errorCode = 0; 
  112.         return;
  113.     }
  114.     setWinTitle(pcv, fWork);    /* ウィンドウタイトルを設定する    */
  115.  
  116.     writeFile(pcv, fWork);        /* ファイルへの書き込み        */
  117.     if (pcv->errorCode != 0)    /* エラーが発生したか?        */
  118.         showErrDialog(pcv);    /* エラーダイアログを表示する    */
  119.  
  120.     TMCaret(pcv->tEditHdl, 1);
  121. }
  122.  
  123. /******************************************************************************
  124.  *    checkDrive():        ファイル名、ドライブのチェック
  125.  ******************************************************************************
  126.  *    引数:    ComVal *pcv    共通変数へのポインタ
  127.  *        char *fName    ファイル名へのポインタ
  128.  *        int mode    ファイルのアクセスモード
  129.  *                = 0: 保存
  130.  *                = 1: 読み込み
  131.  *    戻り値:    BOOLEAN        = TRUE:  正常終了
  132.  *                = FALSE: 異常終了
  133.  */
  134. BOOLEAN checkDrive(ComVal *pcv, char *fName, int mode)
  135. {
  136.     int stat;
  137.     struct NAMECKBUF nminf;
  138.  
  139.     /* 入力されたファイル名を分解・検査 */
  140.     stat = NAMECK((unsigned char *) fName, &nminf);
  141.     if (stat != 0) {
  142.         pcv->errorCode = 14;    /* ファイル名がおかしい        */
  143.         return FALSE;
  144.     }
  145.     /* フルパス名を作成する */
  146.     strmfn(fName, (char *) nminf.drive, (char *) nminf.path, (char *) nminf.name, (char *) nminf.ext);
  147.  
  148.     /* 指定ファイル名のドライブの状態を取得する */
  149.     stat = TSDrvctrl(0, nminf.drive[0] & 0x1f);
  150.     /* ドライブが準備されているかをチェックする */
  151.     if ((stat & 0x06) != 0x02) {
  152.         pcv->errorCode = 15;    /* 準備ができていない        */
  153.         return FALSE;
  154.     }
  155.     /* プロテクトされているかどうかをチェックする */
  156.     if (mode == 0 && (stat & 0x0a) == 0x0a) {
  157.         pcv->errorCode = 16;    /* ライトプロテクト        */
  158.         return FALSE;
  159.     }
  160.  
  161.     return TRUE;
  162. }
  163.  
  164. /******************************************************************************
  165.  *    writeFile():    ファイルへの書き込み
  166.  ******************************************************************************
  167.  *    引数:    ComVal *pcv    共通変数へのポインタ
  168.  *    戻り値:    BOOLEAN        = TRUE:  保存処理終了
  169.  *                = FALSE: 取消または異常終了
  170.  */
  171. BOOLEAN writeFile(ComVal *pcv, char *pname)
  172. {
  173.     int len;
  174.     FILE *fn;
  175.  
  176.     fn = fopen(pname, "wb");
  177.     if (fn == NULL) {
  178.         pcv->errorCode = 13;    /* ファイルができなかった    */
  179.         return FALSE;
  180.     }
  181.     TMCacheFlush(pcv->tEditHdl);    /* キャッシュをフラッシュする */
  182.     /* ファイルに書き込む */
  183.     len = fwrite((unsigned char *) *(*pcv->tEditHdl)->text, sizeof(char), (size_t)(*pcv->tEditHdl)->length, fn);
  184.     if (len != (*pcv->tEditHdl)->length) {
  185.         pcv->errorCode = 12;    /* ライトエラー            */
  186.         return FALSE;
  187.     }
  188.     /* ファイルの最後に EOF のコードを付加する */
  189.     fseek(fn, 0, SEEK_END);
  190.     fputc('\x1a', fn);
  191.     pcv->editFlag = FALSE;        /* 編集フラグをクリアする    */
  192.     fclose(fn);
  193.  
  194.     return TRUE;
  195. }
  196.